#ifndef __herramientas_H__
#define __herramientas_H__

using namespace std;

FILE* outfileMisil;
FILE* outfileBomba;
FILE* outfileTierra;
FILE* outfileSol;		
FILE* outfileLuna;
FILE* outfileMercurio;
FILE* outfileVenus;
FILE* outfileMarte;
FILE* outfileJupiter;
FILE* outfileSaturno;
FILE* outfileNeptuno;
FILE* outfileUrano;
FILE* outfilePluton;

double str2double (const string &str) {
    stringstream ss(str);
    double x;
    ss >> x;
    return x;
}

int str2Int (const string &str) {
    stringstream ss(str);
    int n;
    ss >> n;
    return n;
}

bool contiene(const vector<string>& v, string s){
    for (unsigned int i=0; i<v.size(); i++){
        if (v[i] == s)
            return true;
    }
    return false;
}

double modulo(vector<double> v){
    unsigned int i;
    double result = 0;
	int n = v.size();

    for(i=0; i<n; i++){
        v[i] = v[i] * v[i];
        result += v[i];
    }
    return sqrt(result);
}

void abrirArchivos(const vector<string>& opciones){

	if (contiene(opciones,"misil") || contiene(opciones,"Misil") || contiene(opciones,"MISIL") || contiene(opciones,"Todos")){
		outfileMisil = fopen( "Misil.txt", "w" );
	}

	if (contiene(opciones,"bomba") || contiene(opciones,"Bomba") || contiene(opciones,"BOMBA") || contiene(opciones,"Todos")){
		outfileBomba = fopen( "Bomba.txt", "w" );
	}

	if (contiene(opciones,"tierra") || contiene(opciones,"Tierra") || contiene(opciones,"TIERRA") || contiene(opciones,"Todos")){
		outfileTierra = fopen( "Tierra.txt", "w" );
	}

	if (contiene(opciones,"sol") || contiene(opciones,"Sol") || contiene(opciones,"SOL") || contiene(opciones,"Todos")){
		outfileSol = fopen( "Sol.txt", "w" );
	}

	if (contiene(opciones,"luna") || contiene(opciones,"Luna") || contiene(opciones,"LUNA") || contiene(opciones,"Todos")){
		outfileLuna = fopen( "Luna.txt", "w" );
	}

	if (contiene(opciones,"mercurio") || contiene(opciones,"Mercurio") || contiene(opciones,"MERCURIO") || contiene(opciones,"Todos")){
		outfileMercurio = fopen( "Mercurio.txt", "w" );
	}

	if (contiene(opciones,"venus") || contiene(opciones,"Venus") || contiene(opciones,"VENUS") || contiene(opciones,"Todos")){
		outfileVenus = fopen( "Venus.txt", "w" );
	}

	if (contiene(opciones,"marte") || contiene(opciones,"Marte") || contiene(opciones,"MARTE") || contiene(opciones,"Todos")){
		outfileMarte = fopen( "Marte.txt", "w" );
	}

	if (contiene(opciones,"jupiter") || contiene(opciones,"Jupiter") || contiene(opciones,"JUPITER") || contiene(opciones,"Todos")){
		outfileJupiter = fopen( "Jupiter.txt", "w" );
	}

	if (contiene(opciones,"saturno") || contiene(opciones,"Saturno") || contiene(opciones,"SATURNO") || contiene(opciones,"Todos")){
		outfileSaturno = fopen( "Saturno.txt", "w" );
	}

	if (contiene(opciones,"neptuno") || contiene(opciones,"Neptuno") || contiene(opciones,"NEPTUNO") || contiene(opciones,"Todos")){
		outfileNeptuno = fopen( "Neptuno.txt", "w" );
	}

	if (contiene(opciones,"urano") || contiene(opciones,"Urano") || contiene(opciones,"URANO") || contiene(opciones,"Todos")){
		outfileUrano = fopen( "Urano.txt", "w" );
	}

	if (contiene(opciones,"pluton") || contiene(opciones,"Pluton") || contiene(opciones,"PLUTON") || contiene(opciones,"Todos")){
		outfilePluton = fopen( "Pluton.txt", "w" );
	}
}

void cerrarArchivos(const vector<string>& opciones){

	if (contiene(opciones,"misil") || contiene(opciones,"Misil") || contiene(opciones,"MISIL") || contiene(opciones,"Todos")){		
		fflush(outfileMisil);
		fclose(outfileMisil);
	}

	if (contiene(opciones,"bomba") || contiene(opciones,"Bomba") || contiene(opciones,"BOMBA") || contiene(opciones,"Todos")){		
		fflush(outfileBomba);
		fclose(outfileBomba);
	}

	if (contiene(opciones,"tierra") || contiene(opciones,"Tierra") || contiene(opciones,"TIERRA") || contiene(opciones,"Todos")){		
		fflush(outfileTierra);
		fclose(outfileTierra);
	}

	if (contiene(opciones,"sol") || contiene(opciones,"Sol") || contiene(opciones,"SOL") || contiene(opciones,"Todos")){
		fflush(outfileSol);
		fclose(outfileSol);
	}

	if (contiene(opciones,"luna") || contiene(opciones,"Luna") || contiene(opciones,"LUNA") || contiene(opciones,"Todos")){
		fflush(outfileLuna);
		fclose(outfileLuna);
	}

	if (contiene(opciones,"mercurio") || contiene(opciones,"Mercurio") || contiene(opciones,"MERCURIO") || contiene(opciones,"Todos")){		
		fflush(outfileMercurio);
		fclose(outfileMercurio);
	}

	if (contiene(opciones,"venus") || contiene(opciones,"Venus") || contiene(opciones,"VENUS") || contiene(opciones,"Todos")){
		fflush(outfileVenus);
		fclose(outfileVenus);
	}

	if (contiene(opciones,"marte") || contiene(opciones,"Marte") || contiene(opciones,"MARTE") || contiene(opciones,"Todos")){
		fflush(outfileMarte);
		fclose(outfileMarte);
	}

	if (contiene(opciones,"jupiter") || contiene(opciones,"Jupiter") || contiene(opciones,"JUPITER") || contiene(opciones,"Todos")){
		fflush(outfileJupiter);
		fclose(outfileJupiter);
	}

	if (contiene(opciones,"saturno") || contiene(opciones,"Saturno") || contiene(opciones,"SATURNO") || contiene(opciones,"Todos")){
		fflush(outfileSaturno);
		fclose(outfileSaturno);
	}

	if (contiene(opciones,"neptuno") || contiene(opciones,"Neptuno") || contiene(opciones,"NEPTUNO") || contiene(opciones,"Todos")){
		fflush(outfileNeptuno);
		fclose(outfileNeptuno);
	}

	if (contiene(opciones,"urano") || contiene(opciones,"Urano") || contiene(opciones,"URANO") || contiene(opciones,"Todos")){
		fflush(outfileUrano);
		fclose(outfileUrano);
	}

	if (contiene(opciones,"pluton") || contiene(opciones,"Pluton") || contiene(opciones,"PLUTON") || contiene(opciones,"Todos")){
		fflush(outfilePluton);
		fclose(outfilePluton);
	}
}

void escribirEnArchivo(string nombre, vector<double>& Cuerpo, bool escribirEncabezado, int k){

	if (nombre == "Misil"){
		if (escribirEncabezado){
			fprintf(outfileMisil, "# name: %s\n",nombre.c_str());
			fprintf(outfileMisil, "# type: matrix\n");
			fprintf(outfileMisil, "# rows: %d\n",k+1);
			fprintf(outfileMisil, "# columns: 3\n");
		}
        fprintf(outfileMisil, "%f %f %f\n", Cuerpo[0],Cuerpo[1],Cuerpo[2]);
		return;
	}

	if (nombre == "Bomba"){
		if (escribirEncabezado){
			fprintf(outfileBomba, "# name: %s\n",nombre.c_str());
			fprintf(outfileBomba, "# type: matrix\n");
			fprintf(outfileBomba, "# rows: %d\n",k+1);
			fprintf(outfileBomba, "# columns: 3\n");
		}
        fprintf(outfileBomba, "%f %f %f\n", Cuerpo[0],Cuerpo[1],Cuerpo[2]);
		return;
	}

	if (nombre == "Tierra"){
		if (escribirEncabezado){
			fprintf(outfileTierra, "# name: %s\n",nombre.c_str());
			fprintf(outfileTierra, "# type: matrix\n");
			fprintf(outfileTierra, "# rows: %d\n",k+1);
			fprintf(outfileTierra, "# columns: 3\n");
		}
		fprintf(outfileTierra, "%f %f %f\n", Cuerpo[0],Cuerpo[1],Cuerpo[2]);
		return;
	}

	if (nombre == "Sol"){
		if (escribirEncabezado){
			fprintf(outfileSol, "# name: %s\n",nombre.c_str());
			fprintf(outfileSol, "# type: matrix\n");
			fprintf(outfileSol, "# rows: %d\n",k+1);
			fprintf(outfileSol, "# columns: 3\n");
		}
		fprintf(outfileSol, "%f %f %f\n", Cuerpo[0],Cuerpo[1],Cuerpo[2]);
		return;
	}

	if (nombre == "Luna"){		
		if (escribirEncabezado){
			fprintf(outfileLuna, "# name: %s\n",nombre.c_str());
			fprintf(outfileLuna, "# type: matrix\n");
			fprintf(outfileLuna, "# rows: %d\n",k+1);
			fprintf(outfileLuna, "# columns: 3\n");
		}
		fprintf(outfileLuna, "%f %f %f\n", Cuerpo[0],Cuerpo[1],Cuerpo[2]);
		return;
	}

	if (nombre == "Mercurio"){
		if (escribirEncabezado){
			fprintf(outfileMercurio, "# name: %s\n",nombre.c_str());
			fprintf(outfileMercurio, "# type: matrix\n");
			fprintf(outfileMercurio, "# rows: %d\n",k+1);
			fprintf(outfileMercurio, "# columns: 3\n");
		}
		fprintf(outfileMercurio, "%f %f %f\n", Cuerpo[0],Cuerpo[1],Cuerpo[2]);
		return;
	}

	if (nombre == "Venus"){
		if (escribirEncabezado){
			fprintf(outfileVenus, "# name: %s\n",nombre.c_str());
			fprintf(outfileVenus, "# type: matrix\n");
			fprintf(outfileVenus, "# rows: %d\n",k+1);
			fprintf(outfileVenus, "# columns: 3\n");
		}
		fprintf(outfileVenus, "%f %f %f\n", Cuerpo[0],Cuerpo[1],Cuerpo[2]);		
		return;
	}

	if (nombre == "Marte"){
		if (escribirEncabezado){
			fprintf(outfileMarte, "# name: %s\n",nombre.c_str());
			fprintf(outfileMarte, "# type: matrix\n");
			fprintf(outfileMarte, "# rows: %d\n",k+1);
			fprintf(outfileMarte, "# columns: 3\n");
		}
		fprintf(outfileMarte, "%f %f %f\n", Cuerpo[0],Cuerpo[1],Cuerpo[2]);
		return;
	}

	if (nombre == "Jupiter"){
		if (escribirEncabezado){
			fprintf(outfileJupiter, "# name: %s\n",nombre.c_str());
			fprintf(outfileJupiter, "# type: matrix\n");
			fprintf(outfileJupiter, "# rows: %d\n",k+1);
			fprintf(outfileJupiter, "# columns: 3\n");
		}
		fprintf(outfileJupiter, "%f %f %f\n", Cuerpo[0],Cuerpo[1],Cuerpo[2]);
		return;
	}

	if (nombre == "Saturno"){
		if (escribirEncabezado){
			fprintf(outfileSaturno, "# name: %s\n",nombre.c_str());
			fprintf(outfileSaturno, "# type: matrix\n");
			fprintf(outfileSaturno, "# rows: %d\n",k+1);
			fprintf(outfileSaturno, "# columns: 3\n");
		}
		fprintf(outfileSaturno, "%f %f %f\n", Cuerpo[0],Cuerpo[1],Cuerpo[2]);
		return;
	}

	if (nombre == "Neptuno"){
		if (escribirEncabezado){
			fprintf(outfileNeptuno, "# name: %s\n",nombre.c_str());
			fprintf(outfileNeptuno, "# type: matrix\n");
			fprintf(outfileNeptuno, "# rows: %d\n",k+1);
			fprintf(outfileNeptuno, "# columns: 3\n");
		}
		fprintf(outfileNeptuno, "%f %f %f\n", Cuerpo[0],Cuerpo[1],Cuerpo[2]);		
		return;
	}

	if (nombre == "Urano"){
		if (escribirEncabezado){
			fprintf(outfileUrano, "# name: %s\n",nombre.c_str());
			fprintf(outfileUrano, "# type: matrix\n");
			fprintf(outfileUrano, "# rows: %d\n",k+1);
			fprintf(outfileUrano, "# columns: 3\n");
		}
		fprintf(outfileUrano, "%f %f %f\n", Cuerpo[0],Cuerpo[1],Cuerpo[2]);		
		return;
	}

	if (nombre == "Pluton"){
		if (escribirEncabezado){
			fprintf(outfilePluton, "# name: %s\n",nombre.c_str());
			fprintf(outfilePluton, "# type: matrix\n");
			fprintf(outfilePluton, "# rows: %d\n",k+1);
			fprintf(outfilePluton, "# columns: 3\n");
		}
		fprintf(outfilePluton, "%f %f %f\n", Cuerpo[0],Cuerpo[1],Cuerpo[2]);		
		return;
	}	
}

double random(double i, double j){
	int l1 = (int)1/i;
	int l2 = (int)1/j;
	double aleatorio = ((rand()%l1)+l2);
	aleatorio = 1/aleatorio;
	return aleatorio;
}

double epsilon(double i, double j){
	double res = random(i,j);
	if (rand()%2 == 0){
		res *= -1;
	}
	return res;
}

#endif // __herramientas_H__